bitkeeper revision 1.172 (3e9d5020hc5RUkx3ArM71EjZ_UUbgw)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Wed, 16 Apr 2003 12:44:16 +0000 (12:44 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Wed, 16 Apr 2003 12:44:16 +0000 (12:44 +0000)
Many files:
  Fixed event masking so that events can be individually masked. Fixed Xenolinux config/build system.

xen/arch/i386/entry.S
xen/common/keyhandler.c
xen/include/hypervisor-ifs/hypervisor-if.h
xenolinux-2.4.21-pre4-sparse/arch/xeno/config.in
xenolinux-2.4.21-pre4-sparse/arch/xeno/defconfig
xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/entry.S
xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/hypervisor.c
xenolinux-2.4.21-pre4-sparse/include/asm-xeno/system.h

index ede1fe45e54bde765757e905de628e4ee010c619..3f9c8c99bddf129993bfd56543c925410aeab980 100644 (file)
@@ -115,7 +115,7 @@ FAILSAFE_ADDR   = 32
 
 /* Offsets in shared_info_t */
 EVENTS          =  0
-EVENTS_ENABLE   =  4
+EVENTS_MASK     =  4
 
 /* Offsets in guest_trap_bounce */
 GTB_ERROR_CODE   =  0
@@ -297,13 +297,15 @@ test_all_events:
         jnz  process_hyp_events
 /*test_guest_events:*/
         movl SHARED_INFO(%ebx),%eax
-        test %ecx,EVENTS(%eax)
-        jz   restore_all
-        test %ecx,EVENTS_ENABLE(%eax)
-        jz   restore_all
-        /* Prevent unnecessary reentry of event callback (stack overflow!) */
-        xorl %ecx,%ecx
-        movl %ecx,EVENTS_ENABLE(%eax)      
+        shl  $31,%ecx                   # %ecx = EVENTS_MASTER_ENABLE_MASK
+        test %ecx,EVENTS_MASK(%eax)     
+        jz   restore_all                # only notify if master switch enabled
+        movl EVENTS(%eax),%ecx
+        andl EVENTS_MASK(%eax),%ecx
+        jz   restore_all                # skip if no events to deliver
+        notl %ecx
+        btrl $31,%ecx                   # NB. We clear all events that are
+        andl %ecx,EVENTS_MASK(%eax)     # being delivered + master enable.
 /*process_guest_events:*/
         mov  PROCESSOR(%ebx),%edx
         shl  $4,%edx                    # sizeof(guest_trap_bounce) == 16
index 93b9132a7f79996508b6e6d89fcf26c4ef40c837..261e6fbb7952658c364ca731c5eb21e26a574709 100644 (file)
@@ -103,8 +103,8 @@ void do_task_queues(u_char key, void *dev_id, struct pt_regs *regs)
               task_states[p->state], p->hyp_events); 
        s = p->shared_info; 
        if(!is_idle_task(p)) {
-           printk("Guest: events = %08lx, event_enable = %08lx\n", 
-                  s->events, s->events_enable); 
+           printk("Guest: events = %08lx, events_mask = %08lx\n", 
+                  s->events, s->events_mask); 
            printk("Notifying guest...\n"); 
            set_bit(_EVENT_DEBUG, &s->events); 
        }
index 5d23765aca944c4696e5a15d90ed15b28f3aae6e..6abf2c22224fb3ea07c882f4b77f0d4d05faaa44 100644 (file)
 #define PGEXT_CMD_SHIFT                8
 
 
+/*
+ * Master "switch" for enabling/disabling event delivery.
+ */
+#define EVENTS_MASTER_ENABLE_MASK 0x80000000UL
+#define EVENTS_MASTER_ENABLE_BIT  31
+
+
 #ifndef __ASSEMBLY__
 
 #include "network.h"
@@ -173,12 +180,13 @@ typedef struct shared_info_st {
     /* Bitmask of outstanding event notifications hypervisor -> guest OS. */
     unsigned long events;
     /*
-     * Hypervisor will only signal event delivery via the "callback
-     * exception" when this value is non-zero. Hypervisor clears this when
-     * notiying the guest OS -- this prevents unbounded reentrancy and
-     * stack overflow (in this way, acts as an interrupt-enable flag).
+     * Hypervisor will only signal event delivery via the "callback exception"
+     * when a pending event is not masked. The mask also contains a "master
+     * enable" which prevents any event delivery. This mask can be used to
+     * prevent unbounded reentrancy and stack overflow (in this way, acts as a
+     * kind of interrupt-enable flag).
      */
-    unsigned long events_enable;
+    unsigned long events_mask;
 
     /*
      * Time: The following abstractions are exposed: System Time, Clock Time,
index a12a1ec5c0f64fe0da1038e7f30acef8051ffc5a..7dd6b1c985f9199b7528a6a430c3f644c0e15412 100644 (file)
@@ -125,3 +125,5 @@ if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then
 fi
 
 endmenu
+
+source lib/Config.in
\ No newline at end of file
index 96ede4cd2e8dc3495c2050eae3e4ba639838685a..c9e4e1a4f7ddfb91d7739fc5bc0fcd4429b5da49 100644 (file)
@@ -113,7 +113,7 @@ CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_NBD=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=4096
-# CONFIG_BLK_DEV_INITRD is not set
+CONFIG_BLK_DEV_INITRD=y
 CONFIG_XENOLINUX_BLOCK=y
 
 #
@@ -286,10 +286,11 @@ CONFIG_JBD=y
 # CONFIG_FAT_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_TMPFS is not set
-# CONFIG_RAMFS is not set
+CONFIG_RAMFS=y
 CONFIG_ISO9660_FS=y
 CONFIG_JOLIET=y
 CONFIG_ZISOFS=y
+CONFIG_ZISOFS_FS=y
 # CONFIG_MINIX_FS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_NTFS_FS is not set
@@ -301,6 +302,47 @@ CONFIG_EXT2_FS=y
 # CONFIG_UDF_FS is not set
 # CONFIG_UFS_FS is not set
 
+# Skanky NLS stuff
+CONFIG_NLS_DEFAULT="iso8559-1"
+CONFIG_NLS_CODEPAGE_437=n
+CONFIG_NLS_CODEPAGE_737=n
+CONFIG_NLS_CODEPAGE_775=n
+CONFIG_NLS_CODEPAGE_850=n
+CONFIG_NLS_CODEPAGE_852=n
+CONFIG_NLS_CODEPAGE_855=n
+CONFIG_NLS_CODEPAGE_857=n
+CONFIG_NLS_CODEPAGE_860=n
+CONFIG_NLS_CODEPAGE_861=n
+CONFIG_NLS_CODEPAGE_862=n
+CONFIG_NLS_CODEPAGE_863=n
+CONFIG_NLS_CODEPAGE_864=n
+CONFIG_NLS_CODEPAGE_865=n
+CONFIG_NLS_CODEPAGE_866=n
+CONFIG_NLS_CODEPAGE_869=n
+CONFIG_NLS_CODEPAGE_936=n
+CONFIG_NLS_CODEPAGE_950=n
+CONFIG_NLS_CODEPAGE_932=n
+CONFIG_NLS_CODEPAGE_949=n
+CONFIG_NLS_CODEPAGE_874=n
+CONFIG_NLS_ISO8859_8=n
+CONFIG_NLS_CODEPAGE_1250=n
+CONFIG_NLS_CODEPAGE_1251=n
+CONFIG_NLS_ISO8859_1=n
+CONFIG_NLS_ISO8859_2=n
+CONFIG_NLS_ISO8859_3=n
+CONFIG_NLS_ISO8859_4=n
+CONFIG_NLS_ISO8859_5=n
+CONFIG_NLS_ISO8859_6=n
+CONFIG_NLS_ISO8859_7=n
+CONFIG_NLS_ISO8859_9=n
+CONFIG_NLS_ISO8859_13=n
+CONFIG_NLS_ISO8859_14=n
+CONFIG_NLS_ISO8859_15=n
+CONFIG_NLS_KOI8_R=n
+CONFIG_NLS_KOI8_U=n
+CONFIG_NLS_UTF8=n
+
+
 #
 # Network File Systems
 #
@@ -406,5 +448,4 @@ CONFIG_KALLSYMS=y
 # Library routines
 #
 CONFIG_ZLIB_INFLATE=y
-
-
+CONFIG_ZLIB_DEFLATE=n
index 20ae79e50e26a069fa0b0ddb71dc960db0b176d7..0250f5e11b42fa3560cb1cff9ef29a2f3f7701d4 100644 (file)
@@ -210,15 +210,14 @@ ENTRY(system_call)
        movl %eax,EAX(%esp)             # save the return value
 ENTRY(ret_from_sys_call)
         movl SYMBOL_NAME(HYPERVISOR_shared_info),%esi
-        xorl %eax,%eax
-        movl %eax,4(%esi)               # need_resched and signals atomic test
+        btrl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # make tests atomic
 ret_syscall_tests:      
        cmpl $0,need_resched(%ebx)
        jne reschedule
        cmpl $0,sigpending(%ebx)
        je   safesti                    # ensure need_resched updates are seen
 signal_return:
-       btsl %eax,4(%esi)               # reenable event callbacks
+       btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
        movl %esp,%eax
        xorl %edx,%edx
        call SYMBOL_NAME(do_signal)
@@ -255,8 +254,8 @@ ret_from_exception:
 
        ALIGN
 reschedule:
-        btsl %eax,4(%esi)             # reenable event callbacks
-       call SYMBOL_NAME(schedule)    # test
+        btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
+       call SYMBOL_NAME(schedule)             # test
        jmp ret_from_sys_call
 
 ENTRY(divide_error)
@@ -319,12 +318,12 @@ ENTRY(hypervisor_callback)
         movb CS(%esp),%cl
        test $2,%cl          # slow return to ring 2 or 3
        jne  ret_syscall_tests
-safesti:btsl %eax,4(%esi)     # reenable event callbacks
+safesti:btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
 scrit:  /**** START OF CRITICAL REGION ****/
         cmpl %eax,(%esi)
         jne  14f              # process more events if necessary...
         RESTORE_ALL
-14:     btrl %eax,4(%esi)
+14:     btrl $EVENTS_MASTER_ENABLE_BIT,4(%esi)
         jmp  11b
 ecrit:  /**** END OF CRITICAL REGION ****/
 # [How we do the fixup]. We want to merge the current stack frame with the
@@ -366,7 +365,7 @@ critical_fixup_table:
         .byte 0x20                            # pop  %es
         .byte 0x24,0x24,0x24                  # add  $4,%esp
         .byte 0x28                            # iret
-        .byte 0x00,0x00,0x00,0x00             # btrl %eax,4(%esi)
+        .byte 0x00,0x00,0x00,0x00,0x00        # btrl $31,4(%esi)
         .byte 0x00,0x00                       # jmp  11b
 
 # Hypervisor uses this for application faults while it executes.
index 68670daa8cd63f4c1ba661bb95e610eb387f8aeb..3f414e98762c8fb1f1af07e509bbfb5b03d60c7b 100644 (file)
@@ -27,8 +27,8 @@ void do_hypervisor_callback(struct pt_regs *regs)
 
     do {
         /* Specialised local_irq_save(). */
-        flags = shared->events_enable;
-        shared->events_enable = 0;
+        flags = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT, 
+                                   &shared->events_mask);
         barrier();
 
         events  = xchg(&shared->events, 0);
@@ -50,7 +50,7 @@ void do_hypervisor_callback(struct pt_regs *regs)
             : "eax", "ecx", "edx", "memory" ); 
 
         /* Specialised local_irq_restore(). */
-        shared->events_enable = flags;
+        if ( flags ) set_bit(EVENTS_MASTER_ENABLE_BIT, &shared->events_mask);
         barrier();
     }
     while ( shared->events );
@@ -62,25 +62,25 @@ void do_hypervisor_callback(struct pt_regs *regs)
  * Define interface to generic handling in irq.c
  */
 
-static unsigned int startup_hypervisor_event(unsigned int irq)
-{
-    set_bit(irq, &event_mask);
-    return 0;
-}
-
 static void shutdown_hypervisor_event(unsigned int irq)
 {
     clear_bit(irq, &event_mask);
+    clear_bit(irq, &HYPERVISOR_shared_info->events_mask);
 }
 
 static void enable_hypervisor_event(unsigned int irq)
 {
     set_bit(irq, &event_mask);
+    set_bit(irq, &HYPERVISOR_shared_info->events_mask);
+    if ( test_bit(EVENTS_MASTER_ENABLE_BIT, 
+                  &HYPERVISOR_shared_info->events_mask) )
+        do_hypervisor_callback(NULL);
 }
 
 static void disable_hypervisor_event(unsigned int irq)
 {
     clear_bit(irq, &event_mask);
+    clear_bit(irq, &HYPERVISOR_shared_info->events_mask);
 }
 
 static void ack_hypervisor_event(unsigned int irq)
@@ -90,6 +90,13 @@ static void ack_hypervisor_event(unsigned int irq)
         printk("Unexpected hypervisor event %d\n", irq);
         atomic_inc(&irq_err_count);
     }
+    set_bit(irq, &HYPERVISOR_shared_info->events_mask);
+}
+
+static unsigned int startup_hypervisor_event(unsigned int irq)
+{
+    enable_hypervisor_event(irq);
+    return 0;
 }
 
 static void end_hypervisor_event(unsigned int irq)
index e318716a661a790e3bef8d8352ca3c265aab324a..387ac0fdadbc4cb4c9f42a675021501df5c16486 100644 (file)
@@ -312,31 +312,47 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
 #define set_mb(var, value) do { xchg(&var, value); } while (0)
 #define set_wmb(var, value) do { var = value; wmb(); } while (0)
 
-/* interrupt control.. */
-#define __save_flags(x)         ((x) = HYPERVISOR_shared_info->events_enable); barrier()
-#define __restore_flags(x)                            \
-do {                                                  \
-    shared_info_t *_shared = HYPERVISOR_shared_info;  \
-    _shared->events_enable = (x);                     \
-    barrier();                                        \
-    if ( unlikely(_shared->events) && (x) ) do_hypervisor_callback(NULL);  \
+
+#define __save_flags(x)                                                       \
+do {                                                                          \
+    (x) = test_bit(EVENTS_MASTER_ENABLE_BIT,                                  \
+                   &HYPERVISOR_shared_info->events_mask);                     \
+    barrier();                                                                \
+} while (0)
+
+#define __restore_flags(x)                                                    \
+do {                                                                          \
+    shared_info_t *_shared = HYPERVISOR_shared_info;                          \
+    if (x) set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask);          \
+    barrier();                                                                \
+    if ( unlikely(_shared->events) && (x) ) do_hypervisor_callback(NULL);     \
+} while (0)
+
+#define __cli()                                                               \
+do {                                                                          \
+    clear_bit(EVENTS_MASTER_ENABLE_BIT, &HYPERVISOR_shared_info->events_mask);\
+    barrier();                                                                \
 } while (0)
-#define __cli()                 (HYPERVISOR_shared_info->events_enable = 0); barrier()
-#define __sti()                                       \
-do {                                                  \
-    shared_info_t *_shared = HYPERVISOR_shared_info;  \
-    _shared->events_enable = 1;                       \
-    barrier();                                        \
-    if ( unlikely(_shared->events) ) do_hypervisor_callback(NULL);  \
+
+#define __sti()                                                               \
+do {                                                                          \
+    shared_info_t *_shared = HYPERVISOR_shared_info;                          \
+    set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask);                 \
+    barrier();                                                                \
+    if ( unlikely(_shared->events) ) do_hypervisor_callback(NULL);            \
 } while (0)
+
 #define safe_halt()             ((void)0)
 
 #define __save_and_cli(x)      do { __save_flags(x); __cli(); } while(0);
 #define __save_and_sti(x)      do { __save_flags(x); __sti(); } while(0);
 
-/* For spinlocks etc */
-//XXX#define local_irq_set(x)  __save_and_sti(x)
-#define local_irq_save(x)       ((x) = HYPERVISOR_shared_info->events_enable); (HYPERVISOR_shared_info->events_enable = 0); barrier()
+#define local_irq_save(x)                                                     \
+do {                                                                          \
+    (x) = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT,                        \
+                             &HYPERVISOR_shared_info->events_mask);           \
+    barrier();                                                                \
+} while (0)
 #define local_irq_restore(x)    __restore_flags(x)
 #define local_irq_disable()     __cli()
 #define local_irq_enable()      __sti()